﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Xml.Serialization;
using System.IO;

namespace daStaticAnalyser.Analysers
{
    using daBase.Analyser;

    /// <summary>
    /// Анализатор
    /// </summary>
    public abstract class Analyser : BaseAnalyser
    {
        [Browsable(false)]
        public override object TypeId { get { return base.TypeId; } }

        // Настройки анализатора
        protected BaseAnalyserSettings settings;

        /// <summary>
        /// Событие - свойства изменились
        /// </summary>
        [Browsable(false)]
        public event EventHandler<EventArgs> PropertiesChangedEvent;

        [Category("Общие")]
        [DisplayName("Включен")]
        [Description("Если анализатор выключен, то обнаруживаемые им ошибки будут игнорироваться.")]
        public bool Enabled { get { return settings.Enabled; } set { settings.Enabled = value; Change(); } }

        [Browsable(false)]
        public string Name { get { return (Attribute.GetCustomAttribute(this.GetType(), typeof(AnalyserDefaultSettingsAttribute)) as AnalyserDefaultSettingsAttribute).Name; } }

        /// <summary>
        /// Изменение свойств
        /// </summary>
        protected virtual void CheckChanges() { }

        /// <summary>
        /// Изменение свойств
        /// </summary>
        protected void Change()
        {
            CheckChanges();
            if (PropertiesChangedEvent != null)
                PropertiesChangedEvent(this, new EventArgs());
        }

        /// <summary>
        /// Загрузка анализатора
        /// </summary>
        protected virtual void Init()
        {
            if (settings == null)
                settings = new BaseAnalyserSettings();
            Change();
        }

        /// <summary>
        /// Сохранение себя в файл
        /// </summary>
        /// <param name="FileName">имя файла</param>
        public void Save(string FileName)
        {
            XmlSerializer xmlfile = new XmlSerializer(settings.GetType());
            FileStream file = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None);
            xmlfile.Serialize(file, settings);
            file.Close();
        }

        /// <summary>
        /// Загрузка себя из файла
        /// </summary>
        /// <param name="FileName"></param>
        public void Load(string FileName)
        {
            XmlSerializer xmlfile = new XmlSerializer(settings.GetType());
            FileStream file = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.None);
            try
            {
                settings = (xmlfile.Deserialize(file) as BaseAnalyserSettings);
            }
            catch (Exception)
            {
                Reset();
            }
            file.Close();
        }

        /// <summary>
        /// Сброс настроек анализатора
        /// </summary>
        public void Reset()
        {
            settings = null;
            Init();
        }

        /// <summary>
        /// Инициализация перед анализом
        /// </summary>
        public virtual void InitAnalysis() { }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Settings">настройки</param>
        public Analyser(BaseAnalyserSettings Settings)
        {
            settings = Settings;
            Init();
        }

        /// <summary>
        /// Конструктор
        /// </summary>
        public Analyser()
        {
            Init();
        }
    }
}
